/**
  ******************************************************************************
  * @file    pid_output.h
  * @author  Sherlock
  * @version V0.1
  * @date    8/12/2024
  * @brief   PID compute and output.
  ******************************************************************************
  * @copy
  *
  * <h2><center>&copy; COPYRIGHT 2010 Feirui</center></h2>
  */ 



/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef  __PID_OUTPUT_H__
#define  __PID_OUTPUT_H__

#ifdef __cplusplus
 extern "C" {
#endif

/**
  * @brief GLOBALS RAM definition
  */
#ifdef   PID_OUTPUT_GLOBAL
#define  PID_OUTPUT_EXT
#else
#define  PID_OUTPUT_EXT  extern
#endif


/**
  * @brief  INCLUDE FILES.
  */


/****************************************************************************************
 *                                      PID参数
 ****************************************************************************************/
#define PIDBaseValueExcitationKP            ((float)0.1)
#define PIDBaseValueExcitationKI            ((float)0.01)
#define PIDBaseValueExcitationKD            ((float)0.01)

#define PIDBaseValuePFExcitationKP            ((float)0.0001)
#define PIDBaseValuePFExcitationKI            ((float)0.00001)
#define PIDBaseValuePFExcitationKD            ((float)0.00001)

#define PIDBaseValueStatorKP            ((float)0.0001)
#define PIDBaseValueStatorKI            ((float)0.00001)
#define PIDBaseValueStatorKD            ((float)0.00001)

#define PIDFullDiffOpt          /* 完全微分 */                                   
// #define PIDTSTErrDiffOpt		/* 瞬态误差微分 */
#define PIDTraDiffPartial       (float)0.5
#define PIDTSTDiffPartial       (float)0.5
#define KDaFactorTotal                        100
#define KDaFactor2                            30        /*0.30*New*/
#define KDaFactor3                            20        /*0.50*New*/
#define KDaFactor4                            15        /*0.65*New*/
#define KDaFactor5                            12        /*0.77*New*/
#define KDaFactor6                            8         /*0.85*New*/
#define KDaFactor7                            6         /*0.91*New*/
#define KDaFactor8                            4         /*0.95*New*/
#define KDaFactor9                            3         /*0.98*New*/
#define KDaFactor10                           2         /*1.00*New*/
#define InputDiffMaxAccumulation   2      //微分最多历史累积量
#define OutputDiffMaxAccumulation  ((float)0.95)   //微分在该PI输出和下，不再添加

#define PIDShiftSpeedOpt        //变速PID


/****************************************************************************************
 *                                      预警信号
 ****************************************************************************************/
#define BenchWorkSignal_None          DEF_BIT_NONE
#define BenchWorkSignal_OutOfSync     DEF_BIT_00
#define BenchWorkSignal_ShutOff       DEF_BIT_00
#define BenchWorkSignal_Alarm         DEF_BIT_01


/****************************************************************************************
 *                                      同步
 ****************************************************************************************/
#define SyncLimit_MaxAlowVoltDiff    ((float)0.008)    //允许同步时的最大相对电压差，0.8%
#define SyncLimit_MaxAlowFreqDiff    ((float)0.004)    //允许同步时的最大相对频率，0.4%
#define SyncLimit_MaxAlowPhaseDiff   1                 //允许同步时的最大相对相位，1°
#define SyncSignalWaitTimesMin  10
PID_OUTPUT_EXT uint8_t pidSynchronousCnt;   //同步合闸信号，临时配置


/****************************************************************************************
 *                                      启停机
 ****************************************************************************************/
PID_OUTPUT_EXT uint8_t AVRStopDetectSta;       //允许停机信号
PID_OUTPUT_EXT uint8_t AVRVoltCrankFinish;     //启动标志位，0表示开始启动，1表示启动结束
PID_OUTPUT_EXT float AVRInitialTargetVolt;       //启动时的初始电压
PID_OUTPUT_EXT uint16_t AVRVoltCrankTiCnt;       //缓启动计数器
PID_OUTPUT_EXT uint16_t AVRHWOffDelayTiCnt;      //硬件关断后等待重启动的时长



/****************************************************************************************
 *                                      PID计算结构体
 ****************************************************************************************/
typedef struct
{
    float Kp;
    float Ki;
    float Kd;
    float Kdf;   //微分一阶滤波系数
    float ActiveErr;
    float LastErr;
    float TSTErr;
    float LoopGain; //环路增益
    float Ui;
    float Un;
    float Ud;     //微分总输出
    float Ud2;    //微分D2输出
    float Ud3;    //微分D3输出
    float Ud4;    //微分D4输出
    float Ud5;    //微分D5输出
    float Ud6;    //微分D6输出
    float Ud7;    //微分D7输出
    float Ud8;    //微分D8输出
    float Ud9;    //微分D9输出
    float Ud10;   //微分D10输出
} PIDExcitationOutputType;
PID_OUTPUT_EXT PIDExcitationOutputType PIDExcitationOutput;
PID_OUTPUT_EXT PIDExcitationOutputType PIDStatorPIDOutput;

typedef enum
{
    StatorOutput_Stay,
    StatorOutput_Up  ,
    StatorOutput_Down,
} StatorOutputType;
typedef struct
{
    float threshold;
    float ActiveErr;
    StatorOutputType statorOutput;
} PIDStatorOutputType;
PID_OUTPUT_EXT PIDStatorOutputType PIDStatorOutput;

/****************************************************************************************
 *                                    发电目标功率配置
 ****************************************************************************************/
#define PIDAdjustTarget_ActivePower   0
#define PIDAdjustTarget_PowerFactor   1
PID_OUTPUT_EXT float PIDAdjustTarget[2];

/****************************************************************************************
 *                                    负载电机相关配置
 ****************************************************************************************/
#define AVRConfig_StartFreq            15
#define AVRConfig_StopFreq             18
#define AVRConfig_InitialPWM           ((float)0.05)   //初始PWM
#define AVRConfig_TargetVolt           230             //目标电压
#define AVRConfig_RatedFreq            50              //额定频率
#define AVRConfig_LowFreqTrip          47              //低频拐点
#define AVRConfig_LowFreqRate          5               //低频下降率
#define AVRConfig_HWShutOffDelay       3               //关断时长
#define AVRConfig_SlowStartEnable      DEF_TRUE
#define AVRConfig_SlowStartDelay       6

/* PID部分配置索引 */
#define AVRCfgOrd_TargetVolt          0    //浮点数

#define AVRCfgOrd_SetActivePower      2     //浮点数
#define AVRCfgOrd_SetPointPF          4    //浮点数

#define AVRCfgOrd_PIDActivePowerP     6    //16位整型
#define AVRCfgOrd_PIDActivePowerI     7    //16位整型
#define AVRCfgOrd_PIDActivePowerD     8    //16位整型
#define AVRCfgOrd_PIDPFExciteP        9    //16位整型
#define AVRCfgOrd_PIDPFExciteI        10    //16位整型
#define AVRCfgOrd_PIDPFExciteD        11    //16位整型
#define AVRCfgOrd_PIDAVRP             12    //16位整型
#define AVRCfgOrd_PIDAVRI             13    //16位整型
#define AVRCfgOrd_PIDAVRD             14    //16位整型
#define AVRCfgOrd_PIDSyncP            15    //16位整型
#define AVRCfgOrd_PIDSyncI            16    //16位整型
#define AVRCfgOrd_PIDSyncD            17    //16位整型
#define AVRCfgOrd_PIDCfgNum           12    //16位整型

#define AVRCfgOrd_StartFreq           19     //浮点数
#define AVRCfgOrd_StopFreq            21     //浮点数
#define AVRCfgOrd_InitialPWM          23     //浮点数
#define AVRCfgOrd_RatedFreq           25     //浮点数
#define AVRCfgOrd_LowFreqTrip         27     //浮点数
#define AVRCfgOrd_LowFreqRate         29     //浮点数
#define AVRCfgOrd_HWShutOffDelay      30    //16位整型
#define AVRCfgOrd_SlowStartEnable     31    //16位整型
#define AVRCfgOrd_SlowStartDelay      32    //16位整型
#define AVRCfgOrd_GovMiddleValu       33     //浮点数
#define AVRCfgOrd_LoadCfgNum          16

#define AVRCfgOrd_TOTNum              35


/**
  * @brief Functions
  */
PID_OUTPUT_EXT uint8_t PID_OutputHandle(void);
PID_OUTPUT_EXT void InitPIDOutputObj(void);

#define PID_SYNC_SW_CLOSE GPIO_ResetBits(PIDGPIO_SyncSwitchPort, PIDGPIO_SyncSwitchBitx)
#define PID_SYNC_SW_OPEN  GPIO_SetBits(PIDGPIO_SyncSwitchPort, PIDGPIO_SyncSwitchBitx)

#ifdef __cplusplus
}
#endif

#endif   /*  __PID_OUTPUT_H__  */

/******************* (C) COPYRIGHT 2010 Feirui *****END OF FILE****/